﻿// JsonActionResultDataSource.cs
//

using System;
using jQueryApi;
using OcenyOpisowe.Client.Web;

namespace OcenyOpisowe.Client.Data
{
	/// <summary>
	/// Źródło danych pozwalające na pobieranie danych poprzez rządanie Ajax ze strony
	/// do której dodana jest aplikacja.
	/// </summary>
	public class JsonActionResultDataSource : IDataSource
	{
		#region Prywatne zmienne klasy
		/// <summary>
		/// Typ rządania wykorzystywany przy pobieraniu danych.
		/// </summary>
		private AjaxRequestMethod _requestMethod;
		/// <summary>
		/// Ciąg znaków zawierający parametry dla pobierania danych ze źródła.
		/// </summary>
		private string _dataRequestParameters;
		/// <summary>
		/// Adres url źródła danych.
		/// </summary>
		private string _dataSourceUrl;
		#endregion

		#region Publiczne właściwości klasy
		/// <summary>
		/// Ciąg znaków zawierający parametry dla pobierania danych ze źródła.
		/// </summary>
		public string DataRequestParameters
		{
			get { return _dataRequestParameters; }
			set { _dataRequestParameters = value; }
		}
		/// <summary>
		/// Adres url źródła danych.
		/// </summary>
		public string DataSourceUrl
		{
			get { return _dataSourceUrl; }
			set { _dataSourceUrl = value; }
		}
		/// <summary>
		/// Typ rządania wykorzystywany przy pobieraniu danych.
		/// </summary>
		public AjaxRequestMethod RequestMethod
		{
			get { return _requestMethod; }
			set { _requestMethod = value; }
		}
		#endregion

		#region Konstruktor klasy
		/// <summary>
		/// Inicjuje instancję źródła danych.
		/// Konstruktor przyjmuje adres, z którego będą pobierane dane.
		/// </summary>
		/// <param name="dataSourceUrl">Adres url, z którego będą pobierane dane.</param>
		public JsonActionResultDataSource(string dataSourceUrl)
		{
			_requestMethod = AjaxRequestMethod.Post;
			_dataSourceUrl = dataSourceUrl;
		}
		#endregion

		#region Metody BeginDataLoading
		/// <summary>
		/// Rozpoczyna pobieranie danych ze źródła danych.
		/// Dane te są wymagane do późniejszego procesu bindowania danych do kontrolek.
		/// </summary>
		/// <param name="onDataLoaded">Callback, wywoływany po pobraniu danych ze źródła danych.</param>
		public void BeginDataLoading(AjaxRequestCallback onDataLoaded)
		{
			BeginDataLoadingEx(onDataLoaded, OnLoadingError);
		}
		#endregion

		#region Metoda BeginDataLoadingEx
		/// <summary>
		/// Rozpoczyna pobieranie danych ze źródła danych.
		/// Dane te są wymagane do późniejszego procesu bindowania danych do kontrolek.
		/// </summary>
		/// <param name="onDataLoaded">Callback, wywoływany po pobraniu danych ze źródła danych.</param>
		/// <param name="onError">Callback, wywoływany po stwierdzeniu problemu z pobieraniem danych.</param>
		public void BeginDataLoadingEx(AjaxRequestCallback onDataLoaded, AjaxErrorCallback onError)
		{
			jQueryAjaxOptions ajaxOptions = new jQueryAjaxOptions();

			ajaxOptions.Async = true;
			ajaxOptions.ContentType = "text/x-json";
			ajaxOptions.Data = _dataRequestParameters;
			ajaxOptions.Error = onError;
			ajaxOptions.Success = onDataLoaded;
			ajaxOptions.Type = _requestMethod == AjaxRequestMethod.Get ? "GET" : "POST";
			ajaxOptions.Url = _dataSourceUrl;

			jQuery.Ajax(ajaxOptions);
		}
		#endregion

		#region Metoda OnLoadingError
		/// <summary>
		/// Domyślna metoda wywoływana w momencie wykrycia problemu z pobieraniem danych do kontrolki.
		/// </summary>
		/// <param name="httpRequest">Obiekt rządania HTTP służącego do pobierania danych do kontrolki.</param>
		/// <param name="errorMessage">Treść błędu przekazana z ajax'u.</param>
		/// <param name="ex">Obiekt błędu.</param>
		private void OnLoadingError(jQueryXmlHttpRequest httpRequest, string errorMessage, Exception ex)
		{
			Application.Instance.Console.ReportError(errorMessage);
		}
		#endregion
	}
}
